// 导入数据库操作模块
const db = require('../db/index.js')
//  导入为了保证密码的安全性 bcryptjs
const bcrypt = require('bcryptjs')
// 用这个包来生成 Token 字符串
const jwt = require('jsonwebtoken')
// 导入配置文件
const config = require('../config/config.js')



// 注册用户的处理函数
exports.regUser = (req, res) => {
	// 服务器接收浏览器的表单数据
	// req.body 是浏览器提交的数据
	const userinfo = req.body
	
	
	// ##使用Joi包进行合法的校验
	// 判断提交的数据是否合法
	// if(!userinfo.username || !userinfo.password){
	// 	return res.handleSend("用户名或密码不能为空！")
	// }
	
	
	
	// 定义 SQL 语句
	// 查询语句  results是一个数组
	const sql = 'select * from ev_users where username=?'
	// 执行 SQL 语句并根据结果判断用户名是否被占用
	db.query(sql,userinfo.username,(err,results)=>{
		// 执行 SQL 语句失败
		if(err){
			return res.handleSend(err)
		}
		 // 用户名被占用，因为查询的只有1个结果  可以使用长度来进行判断
		if(results.length > 0){
			return res.handleSend(' 用户名被占用，请更换其他用户名！')
		}
		// 可用用户名
		// 对用户的密码,进行 bcrype 加密，返回值是加密之后的密码字符串
		// console.log(userinfo.password);
		userinfo.password = bcrypt.hashSync(userinfo.password, 12)
		// console.log(userinfo.password);
		
		
		// 定义插入用户的 SQL 语句
		const sqlStr = 'insert into ev_users set ?'
		// 插入新用户
		db.query(sqlStr,{ username:userinfo.username , password:userinfo.password },(err,result)=>{
			// 执行 SQL 语句失败
			if(err) return  res.handleSend(err)
			// SQL 语句执行成功，但影响行数不为 1
			if(result.affectedRows !== 1 ) {
				return res.handleSend('注册用户失败，请稍后再试！')
			}
			// 注册成功
			res.handleSend('注册成功！' ,0)
		})
	})
	
}



// 登录的处理函数
exports.login = (req, res) => {
	// 接收表单数据
	const userinfo = req.body
	
	// 定义 SQL 语句
	// 查询语句是数组
	const sql = 'select * from ev_users where username=?'
	
	// 执行 SQL 语句，查询用户的数据
	db.query(sql,userinfo.username,(err,result)=>{
		// console.log(result);
		// 执行 SQL 语句失败
		if(err) return res.handleSend(err)
		
		// 执行 SQL 语句成功，但是查询到数据条数不等于 1
		if(result.length !== 1) return res.handleSend('登录失败')
		// TODO 登录成功
		
		// 进行密码的比较  bcrypt.compareSync(用户提交的密码, 数据库中的密码)  查询语句是数组
		const compareResult = bcrypt.compareSync(userinfo.password , result[0].password)
		
		// 如果对比的结果等于 false, 则证明用户输入的密码错误
		// 没加密的密码不可以登录到
		if(!compareResult){
			return res.handleSend('登录失败')
		}
		
		// 对用户信息进行处理
		const user = {...result[0],password:'',user_pic:''}
		// console.log(user);
		
		// 生成 Token 字符串  jwt.sign(用户信息，jwtSecretKey字符串,有效期)  将用户信息对象加密成 Token 字符串
		const jwtStr = jwt.sign(
			user,
			config.jwtSecretKey,
			{ expiresIn : '10h' },
		)
		
		// console.log(jwtStr);
		
		res.send({
			status:0,
			message:'登录成功',
			token: "Bearer " + jwtStr
		})
		
	})
}
